scrapbox projectの直径を計算する
2
コードは辛いので把握だけしたい
まず円の中心に相当するものが何なのかがわからない
https://gyazo.com/2b2339f7faba7066d0597b035c98b36e
これでいうとDon't be evilページ?
Don't be evil → 行動規範 → ポリコレ……
こういう感じで辿ってること?
だとして、辿る先はどうやって選んでいる?
たとえば「ページ中で一番最初に出現したリンク?」
いや違うなsta.icon
全ページに対して、そのページからの最長の経路を求め、そのうち最大のものを表示する
?
1. Don't be evil
これはどういう意味?
「Don't be evilページはこのpjの中で最長の経路を持ってますよ」「具体的な長さは表示してませんけど」ってことかな
1. とあるから「最長経路が1なのかな」→「表示順ミスしてるのかな(最大順が最小順になってしまってる)」とか読んでしまう(脳筋)sta.icon
やっぱりコード読まないとダメだ
そして「mapってなんだっけ」ってレベルなので、js思い出していかないと通用しないw
train.iconついでだから「俺が」「コードを効率的に読む」ための方法も確立してしまいたい
-.icon
1 コードリーディングしたい
links
code:js
links = {
"title1": links1,
"title2": links2,
}
たぶんこうなってる
fromEntriesは [key,value] を { key:value} に変換している
links?
ページ内のリンク(たぶんリンク先ページ名)
つまり links_per_title
for (const p in links)
for in ってなんだっけ
p に key が入る
つまりfor (const title in links_per_title)
links[p].forEach(l => { の部分
links[p] は、links = links_per_title[title] のことだな
l には、今見てる title の links の各値(つまりページtitleのリンク先ページ名)が来る
links[l]
これは links_per_title[l]
うー、コード書き換えながら見ていくべきだな
code:js
self.addEventListener('message', async ({data: project}) => {
let diameter = 0;
let diameterList;
const links_per_titles = await getLinkInfo(project);
for (const title in links_per_titles) {
// p: 距離を測る元ページのタイトル
let visited = new Set();
let distList = [], title; // 辿ったページリストと現在のページのペア(=経路)のリスト
let depth = 0;
while (true) {
const nextList = []; // titleから1歩進んだ経路のリスト
links_per_titlestitle.forEach(linkto_title_of_this => { // pのリンク先の各ページを見る
if (not this_linkto_exists) {
return;
}
already_visited = visited.has(linkto_title_of_this)
if(already_visited){
continue; // forEachの中でcontinueってできるんだっけ?(できるとみなす)
}
// 未訪問なら1歩進んだ経路を追加する
visited.add(linkto_title_of_this);
// ★predって何の略?
// ...ってなんだっけ? → pythonでいう *args や
// とりあえず pred は最初は [] だから、newpred も [] やな
newPred.push(title);
// ★次読むなら、この二周目以降から
});
});
if (nextList.length == 0) {
// 行き止まり
break;
}
// 現在の経路リストを更新して繰り返す
distList = nextList;
depth++;
}
// 今までで最長の経路なら、経路長と経路の中身の記録を更新
const newDist = depth - 1;
if (newDist > diameter) {
diameter = newDist;
diameterList = [...distList00, distList01]; }
}
self.postMessage(diameterList);
});
// 全ページのリンク情報を取得
async function getLinkInfo(project = scrapbox.Project.name) {
const rawPages = [];
let followingId = null;
do {
const param = followingId === null ? '' : ?followingId=${followingId};
const res = await fetch(
https://scrapbox.io/api/pages/${project}/search/titles${param}
);
followingId = res.headers.get('X-Following-Id');
rawPages.push(...(await res.json()));
} while (followingId);
}
うー、軽く見たけど、頭追いつかん感じ
アルゴリズム系は大体こうなる
というか久々すぎてw
だいぶ鈍ってるな
コード書く場合も一人でつくっておしまいのパターンばかりやもん
これでも全盛期の頃は脳内でどんどん構造を再現してシミュレートできてたんや……
が、いけないことはないsta.icon
俺もエンジニア名乗るならこれくらいサクッと読めなきゃダメンゴよ
次やるときの戦略
ガチで机上トレースして書きながら見ていくか、デバッグ実行で変数の値見ながらするかしないとダメそう
Scrapbox上でコード書くのはきっちい
先にデータ構造全部洗い出して、名前付け直す
predは、わからんならテキトーに名前つけなおす
捕食する、的な意味っぽい?
経路たどることを「捕食する」とたとえているのだろう
prevのtypoっぽい?